package main

import (
	"fmt"
	"math"
)

// 使用坐标 X、Y 定义一个二维 Point 结构体。
// 同样地，对一个三维点使用它的极坐标定义一个 Polar 结构体。
// 实现一个 Abs() 方法来计算一个 Point 表示的向量的长度，
// 实现一个 Scale() 方法，
// 它将点的坐标乘以一个尺度因子（提示：使用 math 包里的 Sqrt() 函数）
// (function Scale that multiplies the coordinates of a point with a scale factor)。

type Point struct {
	X, Y float64
}

type Point3 struct {
	X, Y, Z float64
}

type Polar struct {
	R, T, Z float64
}

// 向量的长度
func Abs(p *Point) (len float64) {
	len = mySqrt(p.X, p.Y)
	return
}

func mySqrt(x, y float64) (r float64) {
	r = math.Sqrt(float64(x*x + y*y))
	return
}

// return a new Point struct
func Scale(p *Point, factor float64) (q Point) {
	q.X = p.X * factor
	q.Y = p.Y * factor
	return
}

func Point3ToPloar(p *Point3) (r Polar) {
	r.R = mySqrt(p.X, p.Y)
	r.T = math.Atan(p.Y/p.X) * 180 / math.Pi
	r.Z = p.Z
	return
}

func main() {
	point1 := new(Point)
	point1.X = 3
	point1.Y = 4
	fmt.Println("point1 Abs is: ", Abs(point1))

	var f float64 = 1.2
	point2 := Scale(point1, f)
	fmt.Println("point1 with factor 1.2 is: ", point2)

	point3 := &Point3{3, 4, 5}
	polar := Point3ToPloar(point3)
	fmt.Println("point3 trans to polar: ", polar)
}
